package cn.git;

import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;

import java.lang.instrument.Instrumentation;

/**
 * @description: 构造器拦截探针
 * @program: bank-credit-sy
 * @author: lixuchun
 * @create: 2024-12-20
 */
public class ConstructorMethodAgent {

    /**
     * 拦截className
     */
    public static final String CLASS_NAME = "cn.git.service.TestService";

    /**
     * premain方法,main方法执行之前进行调用，插桩代码入口
     * @param args 标识外部传递参数
     * @param instrumentation 插桩对象
     */
    public static void premain(String args, Instrumentation instrumentation) {
        System.out.println("进入到premain方法，参数args[" + args + "]");
        // 创建AgentBuilder对象
        AgentBuilder builder = new AgentBuilder.Default()
                // 忽略拦截的包
                .ignore(ElementMatchers.nameStartsWith("net.bytebuddy")
                        .or(ElementMatchers.nameStartsWith("org.apache"))
                )
                // 当某个类第一次将要加载的时候，会进入到此方法
                .type(getTypeMatcher())
                // 前面的type()方法匹配到的类，进行拦截
                .transform(new ConstructorTransformer());

        // 安装
        builder.installOn(instrumentation);
    }

    private static ElementMatcher<? super TypeDescription> getTypeMatcher() {
        // 1. 使用ElementMatchers.named()方法匹配className
        // return named(CLASS_NAME);

        // 2. 使用名称匹配第二种方式
        return new ElementMatcher<TypeDescription>() {
            @Override
            public boolean matches(TypeDescription target) {
                return CLASS_NAME.equals(target.getActualName());
            }
        };
    }

}
